#ifndef CALLBACK_H
#define CALLBACK_H

#include <iostream>
using namespace std;

#ifndef NULL
#define NULL 0
#endif

class BaseCallback
{
	public:
		virtual void operator()() = 0;
		virtual void Ejecutar() = 0;
};

template <class Clase>
class Callback : public BaseCallback
{
	public:
		typedef void (Clase::*Metodo)();
		Callback();
		Callback(Clase* _instancia, Metodo _metodo);
		void operator ()();
		void Ejecutar();

	private:

		Clase* instancia;
		Metodo metodo;
};


template <class Clase>
Callback<Clase>::Callback()
{
	instancia = NULL;
	metodo = NULL;
}

template <class Clase>
Callback<Clase>::Callback(Clase* _instancia, Metodo _metodo)
{
	instancia = _instancia;
	metodo = _metodo;
}

template <class Clase>
void Callback<Clase>::operator ()()
{
	// QUE ONDA? ANDA?
	try
	{
		if(!instancia)
			throw("Callback nulo!");
	}
	catch(const char* msg)
	{
		cout << msg << endl;
	}
	return (instancia->*metodo)();
}

template <class Clase>
void Callback<Clase>::Ejecutar()
{
	return operator ()();
}

#endif
